package top.z.orm.core.osql;

import java.util.List;
import java.util.Map;

/**
 * 直接用sql语句操作数据库的接口
 * <br>在该接口中的sql字符串要是DB能识别的SQL语句
 * <br>该接口为Bee框架使用的底层接口,不建议用户直接使用
 */
public interface BeeSql {

    /**
     * 根据sql查询数据,数据类型与entity类型一致
     *
     * @param sql    SQL select statement
     * @param entity 与表对应的实体对象,且不能为空
     * @return 可包含多个实体(多条记录)的list
     */
    <T> List<T> select(String sql, T entity);

    /**
     * 多表查询的方法.根据sql查询数据,数据类型与entity类型一致
     *
     * @param sql    SQL select statement
     * @param entity 与表对应的实体对象,且不能为空
     * @return 可包含多个实体(多条记录)的list
     */
    <T> List<T> moreTableSelect(String sql, T entity);

    /**
     * 查询部分字段
     *
     * @param sql    SQL select statement
     * @param entity 与表对应的实体对象,且不能为空
     * @return entity的list, 这些entity只有查询的部分字段会设值
     */
    <T> List<T> selectSomeField(String sql, T entity);

    /**
     * 用函数查询结果.Select result with function. SQL function: max,min,avg,sum,count.
     *
     * @param sql SQL select statement
     * @return 函数统计的值.如果统计的结果集为空, 除了count返回0, 其它都返回空字符
     * @throws ObjSQLException exception
     */
    String selectFun(String sql) throws ObjSQLException;

    /**
     * 查询并将每一行结果转成String数组
     *
     * @param sql SQL select statement
     * @return List, 每个元素是一行记录转换成的string数组
     */
    List<String[]> select(String sql);

    /**
     * 查询并将每一行结果转成Map<String,Object>
     *
     * @param sql SQL select statement
     * @return List, 每个元素是一行记录转换成的Map<String, Object>
     */
    List<Map<String, Object>> selectMapList(String sql);

    /**
     * 查询结果,并以json格式返回
     *
     * @param sql SQL select statement
     * @return json格式结果集
     */
    String selectJson(String sql);

    /**
     * 操作update,insert,delete.对应Jdbc的executeUpdate方法
     *
     * @param sql SQL statement to execute
     * @return 成功操作的记录行数
     */
    Integer modify(String sql);

    /**
     * 提交一批命令到数据库
     * Submits a batch of commands to the database.
     *
     * @param sql 要执行的sql语句数组
     * @return 受影响的行数
     */
    Integer batch(String[] sql);

    /**
     * 提交一批命令到数据库
     *
     * @param sql       要执行的sql语句数组
     * @param batchSize 一个批次提交的命令数目
     * @return 受影响的行数
     */
    Integer batch(String[] sql, int batchSize);
}